Razeni v ListView II

Otázka od: Vymazal Milan

22. 10. 2002 12:20

From: "Vymazal Milan" <vymazal.milan@seznam.cz>
> function CustomSortProc1(Item1, Item2: TListItem; ParamSort: integer):
integer; stdcall;
> var
> c1,c2:integer;
> begin
> try
> c1:=StrToInt(Item1.Caption);
> c2:=StrToInt(Item2.Caption);
> if c1>c2 then result:=1 else
> if c1<c2 then result:=-1 else result:=0;
> except
>
Result:=lstrcmp(PChar(TListItem(Item1).Caption),PChar(TListItem(Item2).Caption
));
> end;
> end;

To je ponekud zbytecne prekombinovane, navic v pripade kde predpokladas vyskyt
dat, ktere nelze prevest na cislo je pouziti vyjimky krajne nevhodne, protoze
jde o ocekavanou situaci. Cele by to slo udelat treba takto:

function CustomSortProc(Item1, Item2: TListItem; ParamSort: Integer): Integer;
stdcall;
var
  N1, N2: Integer;
begin
  if TryStrToInt(Item1.Caption, N1) and TryStrToInt(Item2.Caption, N2) then
    Result := N1 - N2
  else
    Result := CompareStr(Item1.Caption, Item2.Caption);
end;

hmm. asi jsem nejak natvrdlej ale TryStrToInt mi nejak nejde . Delphi
mi to nejka neberou

> ale potreboval bych udelat i sort druheho sloupecku ktery taky
> obsahuje cisla. Skousel jsem to udelat takto ale asi jsem to

function CustomSortProc(Item1, Item2: TListItem; ParamSort: Integer): Integer;
stdcall;

  function ValueCompare(const V1, V2: string): Integer;
  var
    N1, N2: Integer;
  begin
    if TryStrToInt(V1, N1) and TryStrToInt(V2, N2) then
      Result := N1 - N2
    else
      Result := CompareStr(V1, V2);
  end;

begin
  Result := ValueCompare(Item1.Caption, Item2.Caption);
  if Result = 0 then
    Result := ValueCompare(Item1.SubItems[0], Item2.SubItems[0]);
end;

Petr Vones

Odpovedá: Petr Vones

20. 10. 2002 21:32

From: "Vymazal Milan" <vymazal.milan@seznam.cz>
> function CustomSortProc1(Item1, Item2: TListItem; ParamSort: integer):
integer; stdcall;
> var
> c1,c2:integer;
> begin
> try
> c1:=StrToInt(Item1.Caption);
> c2:=StrToInt(Item2.Caption);
> if c1>c2 then result:=1 else
> if c1<c2 then result:=-1 else result:=0;
> except
>
Result:=lstrcmp(PChar(TListItem(Item1).Caption),PChar(TListItem(Item2).Caption
));
> end;
> end;

To je ponekud zbytecne prekombinovane, navic v pripade kde predpokladas vyskyt
dat, ktere nelze prevest na cislo je pouziti vyjimky krajne nevhodne, protoze
jde o ocekavanou situaci. Cele by to slo udelat treba takto:

function CustomSortProc(Item1, Item2: TListItem; ParamSort: Integer): Integer;
stdcall;
var
  N1, N2: Integer;
begin
  if TryStrToInt(Item1.Caption, N1) and TryStrToInt(Item2.Caption, N2) then
    Result := N1 - N2
  else
    Result := CompareStr(Item1.Caption, Item2.Caption);
end;

> ale potreboval bych udelat i sort druheho sloupecku ktery taky
> obsahuje cisla. Skousel jsem to udelat takto ale asi jsem to

function CustomSortProc(Item1, Item2: TListItem; ParamSort: Integer): Integer;
stdcall;

  function ValueCompare(const V1, V2: string): Integer;
  var
    N1, N2: Integer;
  begin
    if TryStrToInt(V1, N1) and TryStrToInt(V2, N2) then
      Result := N1 - N2
    else
      Result := CompareStr(V1, V2);
  end;

begin
  Result := ValueCompare(Item1.Caption, Item2.Caption);
  if Result = 0 then
    Result := ValueCompare(Item1.SubItems[0], Item2.SubItems[0]);
end;

Petr Vones

Odpovedá: Vymazal Milan

22. 10. 2002 13:40


VM> From: "Vymazal Milan" <vymazal.milan@seznam.cz>
>> function CustomSortProc1(Item1, Item2: TListItem; ParamSort: integer):
VM> integer; stdcall;
>> var
>> c1,c2:integer;
>> begin
>> try
>> c1:=StrToInt(Item1.Caption);
>> c2:=StrToInt(Item2.Caption);
>> if c1>c2 then result:=1 else
>> if c1<c2 then result:=-1 else result:=0;
>> except
>>
VM>
Result:=lstrcmp(PChar(TListItem(Item1).Caption),PChar(TListItem(Item2).Caption
VM> ));
>> end;
>> end;

VM> To je ponekud zbytecne prekombinovane, navic v pripade kde predpokladas
vyskyt
VM> dat, ktere nelze prevest na cislo je pouziti vyjimky krajne nevhodne,
protoze
VM> jde o ocekavanou situaci. Cele by to slo udelat treba takto:

VM> function CustomSortProc(Item1, Item2: TListItem; ParamSort: Integer):
Integer;
VM> stdcall;
VM> var
VM> N1, N2: Integer;
VM> begin
VM> if TryStrToInt(Item1.Caption, N1) and TryStrToInt(Item2.Caption, N2) then
VM> Result := N1 - N2
VM> else
VM> Result := CompareStr(Item1.Caption, Item2.Caption);
VM> end;

 hmm. asi jsem nejak natvrdlej ale TryStrToInt mi nejak nejde . Delphi
 mi to nejka neberou

Milan

Odpovedá: Petr Vones

22. 10. 2002 13:44

From: "Vymazal Milan" <vymazal.milan@seznam.cz>
> hmm. asi jsem nejak natvrdlej ale TryStrToInt mi nejak nejde . Delphi
> mi to nejka neberou

Patrne mas starsi verzi Delphi, jelikoz nebyla verze v dotazu uvedena tak
implicitne predpokladam posledni verzi, tedy 7. Funkce TryStrToInt je vcelku
jednoducha, muze vypadat treba takhle:

function TryStrToInt(const S: string; var Value: Integer): Boolean;
var
  Error: Integer;
begin
  Val(S, Value, Error);
  Result := (Error = 0);
end;

Petr Vones

Odpovedá: Vymazal Milan

22. 10. 2002 15:59

Hello Petr,

Tuesday, October 22, 2002, 2:42:35 PM, you wrote:

PV> From: "Vymazal Milan" <vymazal.milan@seznam.cz>
>> hmm. asi jsem nejak natvrdlej ale TryStrToInt mi nejak nejde . Delphi
>> mi to nejka neberou

PV> Patrne mas starsi verzi Delphi, jelikoz nebyla verze v dotazu uvedena tak
PV> implicitne predpokladam posledni verzi, tedy 7. Funkce TryStrToInt je
vcelku
PV> jednoducha, muze vypadat treba takhle:

PV> function TryStrToInt(const S: string; var Value: Integer): Boolean;
PV> var
PV> Error: Integer;
PV> begin
PV> Val(S, Value, Error);
PV> Result := (Error = 0);
PV> end;

Diky moc. mam totiz Delphi 5. ale nevedel jsem ze tam jsou nejake
rozdili tohoto typu

PV> Petr Vones




--
Best regards,
 Vymazal mailto:vymazal.milan@seznam.cz